package com.situ.fly.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.situ.fly.entity.User;
import com.situ.fly.service.UserService;

@Controller
@RequestMapping("/user")
/*
 * 给当前类中的所有处理器添加一个URL的前缀
 */
public class UserController {
	
	@Autowired
	private UserService userService;

	/**
	 * 定义用户注册方法, 返回注册视图
	 * get请求是浏览器中的默认请求方式
	 * 1) 在浏览器地址栏中输入网址, 请求
	 * 2) 点击超链接
	 * 3) 表单默认提交方式
	 * 4) ajax默认提交方式
	 * 
	 */
	@GetMapping("/reg")	// http://127.0.0.1:9000/user/reg
	public String reg() {
		return "user/reg";	// 视图指是的在user文件夹下的reg.html
	}
	
	/**
	 * 编写一个Post请求的方法, 处理注册请求的具体过程
	 * 在SpringMVC的处理器方法中, 可以根据参数的名字进行自动的注入
	 * 比如: 用户在注册页面中填写的验证码叫vercode
	 * 		在reg方法中, 只需要定义一个参数vercode, 
	 * SpringMVC还可以注入实体类对象, 根据前端参数的名字与实体类属性的名字进行注入
	 * 		
	 * 
	 */
	@PostMapping("/reg")
	public String reg(String vercode, String repassword, User user,
			HttpSession session,
			Model model) {
		// 会话: 在一个时间段内, 客户与服务器之间连续的多次请求
		
		// 在处理器方法中, 需要做以下几件事
		// 1. 获取参数, 由SpringMVC参数的自动注入完成
		// 2. 调用Service层进行业务的处理
		// 校验验证码是否正确
		String oldVercode = (String) session.getAttribute("vercode");
		if (oldVercode==null || !vercode.toUpperCase().equals(oldVercode)) {
			// 老的验证不存在, 或者 用户填写的验证码与老的验证码不一样
			// 1. 向客户端页面返回错误提示
			model.addAttribute("error", "验证码错误!!!");
			// 2. 返回注册页面	// 请求转发
			return "user/reg";	
		}
		
		// 调用Service层的reg方法
		int result = userService.reg(user, repassword);
		
		// 3. 跳转页面/返回数据
		if (result > 0) {
			// 重定向到一个新的页面
			// 向客户端浏览器发送一条指令, 让浏览跳转到/user/login
			return "redirect:/user/login";
		} else if (result == -1){
			model.addAttribute("error", "两次密码不一致!!!");
		} else if (result == -2) {
			model.addAttribute("error", "账号已被注册!!!");
		} else if (result == -3) {
			model.addAttribute("error", "昵称已被使用!!!");
		} else {
			model.addAttribute("error", "未知错误,请联系管理员!!!");
		}
		
		return "user/reg";
	}
	
	/**
	 * 打开登录页面
	 */
	@GetMapping("/login")
	public String login() {
		return "user/login";
	}
	
	/**
	 * 处理用户登录的请求
	 */
	@PostMapping("/login")
	public String login(User user, String vercode,
			HttpSession session,
			Model model) {
		// 1. 获取参数
		// 2. 处理业务
		// 验证码
		String oldVercode = (String) session.getAttribute("vercode");
		if (oldVercode==null || !vercode.toUpperCase().equals(oldVercode)) {
			// 错误信息
			model.addAttribute("error", "验证码错误!!!");
			// 返回登录页面
			return "user/login";
		}
		
		// 调用Service层
		try {
			User loginUser = userService.login(user);
			// 登录成功
			// 保存登录信息
			session.setAttribute("user", loginUser);
			// 跳转到主页
			return "redirect:/";
		} catch (Exception e) {
			e.printStackTrace();
			// 登录失败了
			model.addAttribute("error", e.getMessage());
		}
		
		// 3. 跳转页面
		return "user/login";
	}
}



